﻿using System;
using System.Collections.Generic;
using System.Linq;
using NHibernate;
using NHibernate.Linq;
using StructureMap;
using TimeTracker.Core.Domain;
using TimeTracker.Core.Domain.Entities;

namespace TimeTracker.Core.DataAccess.Implementation
{
    [Pluggable("Default")]
    public class KorisnikRepository : RepositoryBase, IKorisnikRepository
    {
        public List<Korisnik> UzmiSveKorisnike()
        {
            var korisnikQuery = (from korisnici in NHibernateSession.Linq<Korisnik>()
                                 select korisnici).ToList();

            return korisnikQuery;
        }

        public Korisnik UzmiKorisnikaPoId(int korisnikId)
        {
            var korisnik = (from korisnici in NHibernateSession.Linq<Korisnik>()
                            where korisnici.KorisnikId == korisnikId
                            select korisnici).SingleOrDefault();

            return korisnik;
        }

        public Korisnik UzmiKorisnikaPoKorisnickomImenu(string korisnickoIme)
        {
            var korisnik = (from korisnici in NHibernateSession.Linq<Korisnik>()
                            where korisnici.KorisnickoIme == korisnickoIme
                            select korisnici).SingleOrDefault();

            return korisnik;
        }

        public Korisnik UzmiKorisnikaPoEmailu(string email)
        {
            var korisnik = (from korisnici in NHibernateSession.Linq<Korisnik>()
                            where korisnici.Email == email
                            select korisnici).SingleOrDefault();

            return korisnik;
        }

        public Korisnik UzmiKorisnikaPoKorisnickomImenuLozinci(string korisnickoIme, string lozinka)
        {
            var korisnik = (from korisnici in NHibernateSession.Linq<Korisnik>()
                            where korisnici.KorisnickoIme == korisnickoIme && korisnici.Lozinka == lozinka
                            select korisnici).SingleOrDefault();

            return korisnik;
        }

        public void DodajKorisnika(string korisnickoIme, string lozinka, string email)
        {
            var korisnik = new Korisnik
                               {
                                   KorisnickoIme = korisnickoIme,
                                   Lozinka = lozinka,
                                   Email = email
                               };

            NHibernateSession.SaveOrUpdate(korisnik);

            using (ITransaction transaction = NHibernateSession.BeginTransaction())
            {
                try
                {
                    transaction.Commit();
                }
                catch(Exception ex)
                {
                    transaction.Rollback();
                    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
                }
            }
        }

        public void AzurirajKorisnika(int korisnikId, string imeKorisnika, string lozinka, string email)
        {
            var korisnik = (from korisnici in NHibernateSession.Linq<Korisnik>()
                     where korisnici.KorisnikId == korisnikId
                     select korisnici).SingleOrDefault();

            NHibernateSession.Update(korisnik);

            using (ITransaction transaction = NHibernateSession.BeginTransaction())
            {
                try
                {
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
                }
            }
        }

        public void ObrisiKorisnika(int korisnikId)
        {
            var korisnik = (from korisnici in NHibernateSession.Linq<Korisnik>()
                            where korisnici.KorisnikId == korisnikId
                            select korisnici).SingleOrDefault();

            NHibernateSession.Delete(korisnik);

            using (ITransaction transaction = NHibernateSession.BeginTransaction())
            {
                try
                {
                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
                }
            }

        }
    }
}
